우리 모두는 서로 다른 테이블의 데이터를 결합하는 데 도움이 되는 잘 알려진 VLOOKUP() 함수를 알고 있습니다. 그러나 이 함수에는 한 가지 중요한 단점이 있습니다. 유사한 값을 결합할 수 없습니다. 즉, 단어에 오류가 있으면 일치 항목이 없습니다.
대략적인 값을 결합할 수 있도록 자체 함수를 만들 수 있습니다. 이를 FuzzyLookup()이라고 부르겠습니다.
두 개의 목록이 있다고 상상해 봅시다. 둘 다 거의 동일한 요소를 가지고 있지만 약간 다르게 작성될 수 있습니다. 임무는 첫 번째 목록의 각 요소에 대해 두 번째 목록에서 가장 유사한 요소를 찾는 것입니다. 가장 가까운 최대 유사한 텍스트에 대한 검색을 구현합니다.
이 경우 가장 큰 문제는 "유사성"의 기준을 무엇으로 간주해야 하는가입니다. 단지 일치하는 문자의 수인가요? 연속 일치 횟수입니까? 대소문자나 공백을 고려해야 합니까? 구문에서 단어 배열이 다르면 어떻게 해야 합니까? 많은 옵션이 있으며 단일 솔루션은 없습니다. 각 상황에 대해 둘 중 하나가 다른 것보다 나을 것입니다.
우리의 경우에는 가장 간단한 옵션인 최대 문자 일치 수로 검색을 구현합니다. 완벽하지는 않지만 대부분의 상황에서 꽤 잘 작동합니다.
추가하려면 함수 FuzzyLookup , 메뉴를 엽니다 Tools - Macros - Edit Macros... , 선택하다 모듈1 다음 텍스트를 모듈에 복사합니다.
Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String ' moonexcel.com.ua Dim Str As String Dim CellArray As Variant Dim StrArray As Variant If IsMissing(SimThreshold) Then SimThreshold = 0 Str = LCase(LookupValue) StrArray = Split(Str) StrExt = UBound(StrArray) For Each Cell In SrcTable CellArray = Split(LCase(Cell)) CellExt = UBound(CellArray) CellRate = 0 ' 검색 문구의 각 단어를 확인합니다. For x = 0 To StrExt StrWord = StrArray(x) If Len(StrWord) = 0 Then GoTo continue_x MaxStrWordRate = 0 ' 원래 값 표에서 다음 셀의 각 단어를 확인합니다. For i = 0 To CellExt CellWord = CellArray(i) If Len(CellWord) = 0 Then GoTo continue_i FindCharNum = OccurrenceNum(StrWord, CellWord) StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord)) If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate continue_i: Next i CellRate = CellRate + MaxStrWordRate continue_x: Next x ' 우리는 최고의 경기를 유지합니다 If CellRate > MaxCellRate Then MaxCellRate = CellRate BestCell = Cell FindCharNum = OccurrenceNum(Str, Cell) SimRate = FindCharNum / Max(Len(Str),Len(Cell)) End If Next Cell IF SimRate >= SimThreshold Then IF SimThreshold = -1 Then ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")" ElseIf SimThreshold = -2 Then ReturnValue = Format(SimRate, "0.00") Else ReturnValue = BestCell End If Else ReturnValue = "" End If FuzzyLOOKUP = ReturnValue End Function Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String) For i = 1 To Len(SourceString) ' 우리는 각 기호의 발생을 찾고 있습니다. Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1) ' 우연의 카운터를 높인다 If Position > 0 Then Count = Count + 1 ' 발견된 기호 제거 TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position) End If Next i OccurrenceNum = Count End Function Function Max(ByVal value1 As Variant, ByVal value2 As Variant) If value1 > value2 Then Result = value1 Else Result = value2 End If Max = Result End Function
다음으로 닫으세요. Macro Editor 그리고 워크시트로 돌아가서 LibreOffice Calc - 이제 새로운 기능을 사용할 수 있습니다 FuzzyLookup() .
기능을 사용할 수도 있습니다. FUZZYLOOKUP() 무료 확장 프로그램을 설치하여 YouLibreCalc.oxt 또는 모든 기능을 갖춘 버전 YLC_Utilities.oxt .
그 후에는 LibreOffice Calc에서 열리는 모든 파일에서 이 기능을 사용할 수 있습니다.